package com.munichosica.myapp.jdbc;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import com.munichosica.myapp.dao.AlmacenDao;
import com.munichosica.myapp.dto.Almacen;
import com.munichosica.myapp.exceptions.AlmacenDaoException;

public class AlmacenDaoImpl implements AlmacenDao{
	private StringBuilder sql=null;
	private StringBuilder sqlSelect=null; 
	
	public AlmacenDaoImpl() {
		sql=new StringBuilder();
		sqlSelect=new StringBuilder();
		sqlSelect.append("SELECT ALMCODIGO_I AS CODIGO," +
				"ALMNOMBRE_V AS NOMBRE," +
				"ALMDIRECCION_V AS DIRECCION," +
				"ALMREFERENCIA_V AS REFERENCIA," +
				"ALMTELEFONO_V AS TELEFONO," +
				"ALMOPERADOR_C AS OPERADOR," +
				"ALMCELULAR_V AS CELULAR," +
				"ALMESTADO_C AS ESTADO," +
				"ALMUSUARIOREGISTRA_V AS USUARIOREGISTRA," +
				"ALMFECHAREGISTRA_F AS FECHAREGISTRA," +
				"ALMUSUARIOACTUALIZA_V AS USUARIOACTUALIZA," +
				"ALMFECHAACTUALIZA_F AS FECHAACTUALIZA," +
				"ALMIP_V AS IP " +
				"FROM ALMACEN ");
	}
	@Override
	public List<Almacen> listarPorCriterio(String criterio, String texto,
			String estado) throws AlmacenDaoException {
		sql.append("SELECT ALM.ALMCODIGO_I AS CODIGO, " +
				"IFNULL(ALM.ALMNOMBRE_V,'') AS NOMBRE, " +
				"IFNULL(ALM.ALMDIRECCION_V,'') AS DIRECCION, " +
				"IFNULL(ALM.ALMREFERENCIA_V,'') AS REFERENCIA, " +
				"IFNULL(ALM.ALMTELEFONO_V,'') AS TELEFONO, " +
				"CASE IFNULL(ALM.ALMOPERADOR_C,'') " +
				"WHEN 'C' THEN 'CLARO' " +
				"WHEN 'M' THEN 'MOVISTAR' " +
				"WHEN 'N' THEN 'NEXTEL' END AS OPERADOR, " +
				"IFNULL(ALM.ALMCELULAR_V,'') AS CELULAR, " +
				"IFNULL(ALM.ALMESTADO_C,'') AS ESTADO, " +
				"IFNULL(ALM.ALMUSUARIOREGISTRA_V,'') AS USUARIOREGISTRA, " +
				"ALM.ALMFECHAREGISTRA_F AS FECHAREGISTRA, " +
				"ALM.ALMUSUARIOACTUALIZA_V AS USUARIOACTUALIZA, " +
				"ALM.ALMFECHAACTUALIZA_F AS FECHAACTUALIZA, " +
				"IFNULL(ALM.ALMIP_V,'') AS IP " +
				"FROM ALMACEN ALM " +
				"WHERE ALM.ALMESTADO_C LIKE '%"+estado.trim()+"%' ");		
		if(!criterio.isEmpty()) sql.append("AND "+criterio.trim()+" LIKE '%"+texto.trim()+"%'");
		
		Connection conn=null;
		PreparedStatement stmt=null;
		ResultSet rs=null;
		List<Almacen> lista=null;
		try {
			conn=ResourceManager.getConnection();
			stmt=conn.prepareStatement(sql.toString());
			boolean results=stmt.execute();
			if(results){
				lista=new ArrayList<Almacen>();
				rs=stmt.getResultSet();
				Almacen almacen=null;
				while(rs.next()){
					almacen=new Almacen();
					almacen.setAlmcodigoI(rs.getInt("CODIGO"));
					almacen.setAlmnombreV(rs.getString("NOMBRE"));
					almacen.setAlmdireccionV(rs.getString("DIRECCION"));
					almacen.setAlmreferenciaV(rs.getString("REFERENCIA"));
					almacen.setAlmtelefonoV(rs.getString("TELEFONO"));
					almacen.setAlmoperadorC(rs.getString("OPERADOR"));
					almacen.setAlmcelularV(rs.getString("CELULAR"));
					almacen.setAlmestadoC(rs.getString("ESTADO"));
					almacen.setAlmusuarioregistraV(rs.getString("USUARIOREGISTRA"));
					almacen.setAlmfecharegistraF(rs.getString("FECHAREGISTRA"));
					almacen.setAlmusuarioactualizaV(rs.getString("USUARIOACTUALIZA"));
					almacen.setAlmfechaactualizaF(rs.getString("FECHAACTUALIZA"));
					almacen.setAlmipV(rs.getString("IP"));
					lista.add(almacen);
				}
			}
		} catch (SQLException e) {
			throw new AlmacenDaoException(e.getMessage(),e);
		} finally{
			ResourceManager.close(rs);
			ResourceManager.close(stmt);
			ResourceManager.close(conn);
		}
		return lista;
	}

	@Override
	public Almacen insertar(Almacen almacen) throws AlmacenDaoException {
		sql.append("INSERT INTO ALMACEN (almnombre_v, almdireccion_v, almreferencia_v, " +
				"almtelefono_v, almoperador_c, almcelular_v, " +
				"almestado_c, almusuarioregistra_v, almfecharegistra_f, almip_v) " +
				"VALUES (?, ?, ?, ?, ?, ?, ?, ?, CURDATE(),?)");
		Connection conn=null;
		PreparedStatement stmt=null;
		ResultSet rs=null;
		try {
			conn=ResourceManager.getConnection();
			stmt=conn.prepareStatement(sql.toString(),PreparedStatement.RETURN_GENERATED_KEYS);
			stmt.setString(1, almacen.getAlmnombreV());
			stmt.setString(2, almacen.getAlmdireccionV());
			stmt.setString(3, almacen.getAlmreferenciaV());
			stmt.setString(4, almacen.getAlmtelefonoV());
			stmt.setString(5, almacen.getAlmoperadorC());
			stmt.setString(6, almacen.getAlmcelularV());
			stmt.setString(7, almacen.getAlmestadoC());
			stmt.setString(8, almacen.getAlmusuarioregistraV());
			stmt.setString(9, almacen.getAlmipV());
			int results=stmt.executeUpdate();
			if(results>0){
				rs=stmt.getGeneratedKeys();
				if(rs.next()){
					almacen.setAlmcodigoI(rs.getInt(1));
				}
			}
		} catch (SQLException e) {
			throw new AlmacenDaoException(e.getMessage(),e);
		} finally{
			ResourceManager.close(rs);
			ResourceManager.close(stmt);
			ResourceManager.close(conn);
		}
		return almacen;
	}

	@Override
	public Almacen modificar(Almacen almacen) throws AlmacenDaoException {
		sql.append("UPDATE ALMACEN SET almnombre_v=?, " +
				"almdireccion_v=?, almreferencia_v=?, " +
				"almtelefono_v=?, almoperador_c=?, " +
				"almcelular_v=?, " +
				"almusuarioactualiza_v=?, almfechaactualiza_f=CURDATE(), " +
				"almip_v=?, almestado_c=? " +
				"WHERE almcodigo_i=?");
		Connection conn=null;
		PreparedStatement stmt=null;
		try {
			conn=ResourceManager.getConnection();
			stmt=conn.prepareStatement(sql.toString());
			stmt.setString(1, almacen.getAlmnombreV());
			stmt.setString(2, almacen.getAlmdireccionV());
			stmt.setString(3, almacen.getAlmreferenciaV());
			stmt.setString(4, almacen.getAlmtelefonoV());
			stmt.setString(5, almacen.getAlmoperadorC());
			stmt.setString(6, almacen.getAlmcelularV());
			stmt.setString(7, almacen.getAlmusuarioregistraV());
			stmt.setString(8, almacen.getAlmipV());
			stmt.setString(9, almacen.getAlmestadoC());
			stmt.setInt(10, almacen.getAlmcodigoI());
			stmt.executeUpdate();
		} catch (SQLException e) {
			throw new AlmacenDaoException(e.getMessage(),e);
		} finally{
			ResourceManager.close(stmt);
			ResourceManager.close(conn);
		}
		return almacen;
	}

	@Override
	public Almacen obtener(Integer codigo) throws AlmacenDaoException {
		sqlSelect.append("WHERE ALMCODIGO_I=?");
		
		Connection conn=null;
		PreparedStatement stmt=null;
		ResultSet rs=null;
		Almacen almacen=null;
		try {
			conn=ResourceManager.getConnection();
			stmt=conn.prepareStatement(sqlSelect.toString());
			stmt.setInt(1, codigo);
			boolean results=stmt.execute();
			if(results){
				rs=stmt.getResultSet();
				if(rs.next()){
					almacen=new Almacen();
					almacen.setAlmcodigoI(rs.getInt("CODIGO"));
					almacen.setAlmnombreV(rs.getString("NOMBRE"));
					almacen.setAlmdireccionV(rs.getString("DIRECCION"));
					almacen.setAlmreferenciaV(rs.getString("REFERENCIA"));
					almacen.setAlmtelefonoV(rs.getString("TELEFONO"));
					almacen.setAlmoperadorC(rs.getString("OPERADOR"));
					almacen.setAlmcelularV(rs.getString("CELULAR"));
					almacen.setAlmestadoC(rs.getString("ESTADO"));
					almacen.setAlmusuarioregistraV(rs.getString("USUARIOREGISTRA"));
					almacen.setAlmfecharegistraF(rs.getString("FECHAREGISTRA"));
					almacen.setAlmusuarioactualizaV(rs.getString("USUARIOACTUALIZA"));
					almacen.setAlmfechaactualizaF(rs.getString("FECHAACTUALIZA"));
					almacen.setAlmipV(rs.getString("IP"));
				}
			}
		} catch (SQLException e) {
			throw new AlmacenDaoException(e.getMessage(),e);
		} finally{
			ResourceManager.close(rs);
			ResourceManager.close(stmt);
			ResourceManager.close(conn);
		}
		return almacen;
	}

	@Override
	public void eliminar(Almacen almacen) throws AlmacenDaoException {
		sql.append("UPDATE ALMACEN SET almestado_c='I', " +
				"almusuarioactualiza_v=?, almfechaactualiza_f=CURDATE()," +
				"almip_v=? " +
				"WHERE almcodigo_i=?");
		Connection conn=null;
		PreparedStatement stmt=null;
		try {
			conn=ResourceManager.getConnection();
			stmt=conn.prepareStatement(sql.toString());
			stmt.setString(1, almacen.getAlmusuarioactualizaV());
			stmt.setString(2, almacen.getAlmipV());
			stmt.setInt(3, almacen.getAlmcodigoI());
			stmt.executeUpdate();
		} catch (SQLException e) {
			throw new AlmacenDaoException(e.getMessage(),e);
		} finally{
			ResourceManager.close(stmt);
			ResourceManager.close(conn);
		}
	}
	
	@Override
	public boolean existeUsuario(String usuario) throws AlmacenDaoException {
		sql.append("SELECT COUNT(USU.USUUSUARIO_V) AS CANTIDAD " +
				"FROM ALMACEN ALM " +
				"INNER JOIN USUARIO USU ON USU.USUCODIGO_I=ALM.USUCODIGO_I " +
				"WHERE USU.USUUSUARIO_V=?");
		Connection conn=null;
		PreparedStatement stmt=null;
		ResultSet rs=null;
		try{
			conn=ResourceManager.getConnection();
			stmt=conn.prepareStatement(sql.toString());
			stmt.setString(1, usuario);
			boolean result=stmt.execute();
			if(result){
				rs=stmt.getResultSet();
				if(rs.next()){
					int count=rs.getInt("CANTIDAD");
					if(count>0){
						return true;						
					}
				}
			}			
		} catch (SQLException e) {
			throw new AlmacenDaoException(e.getMessage(),e);
		} finally{
			ResourceManager.close(rs);
			ResourceManager.close(stmt);
			ResourceManager.close(conn);
		}
		return false;
	}

}
